package redis

import (
	"fmt"
	"github.com/go-redis/redis"
	"time"
)

// Pipeline 主要是一种网络优化。
// 它本质上意味着客户端缓冲一堆命令并一次性将它们发送到服务器。
// 这些命令不能保证在事务中执行。
// 这样做的好处是节省了每个命令的网络往返时间（RTT）。
// 下面示例相当于将以下两个命令一次发给redis server端执行，与不使用Pipeline相比能减少一次RTT。
func PipelineExample1() {
	pipe := rdb.Pipeline()

	incr := pipe.Incr("pipeline_counter")
	pipe.Expire("pipeline_counter", time.Hour)

	_, err := pipe.Exec()
	fmt.Println(incr.Val(), err)
}

// 也可以使用Pipelined：
func PipelinedExample2() {
	var incr *redis.IntCmd
	_, err := rdb.Pipelined(func(pipe redis.Pipeliner) error {
		incr = pipe.Incr("pipelined_counter")
		pipe.Expire("pipelined_counter", time.Hour)
		return nil
	})
	fmt.Println(incr.Val(), err)
}
